#ifndef NOEUD_H
#define NOEUD_H

#include <iostream>
#include <list>

using namespace std;

typedef enum {
	NOEUD_e,
	BALISE_e,
	TEXTE_e
} NoeudType;

class Balise;

/**
	classe abstraite représentant un noeud XML. 
	Peut etre une balise ou un texte.
*/
class Noeud {
	private:
		/**  père de la balise */
		Balise* pere;

	public:
		/** constructeur */
		Noeud();

		/** retourne le père du noeud */
		Balise* getPere();

		/** set la balise père à unPère */
		void setPere(Balise* unPere);

		/** retourne vrai si le noeud est une balise, faux sinon */
		virtual bool estBalise();

		virtual NoeudType getType() = 0;

		/* Renvoie une copie profonde */
		virtual Noeud* getCopieProfonde() = 0;

		/** 
			renvoi un string représentant la version XML du noeud
			méthode abstraitre pure
		*/
		virtual string toString(int nbTab) = 0;

		/** retourne une expression texte à comparer à une regex pour valider le XML */ 
		virtual string getRegexExp() = 0;

		/** destructeur */
		virtual ~Noeud() {};		
};

typedef list<Noeud*>::iterator NoeudIterator;

#endif
